import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingDeque;

public class ThreadDemo17 {
    public static void main(String[] args) throws InterruptedException {
        BlockingQueue<String> queue = new LinkedBlockingDeque<>();
        // 阻塞队列是线程安全的
        // 队列满 或者 队列空 都会阻塞
        // 1. put 入队列
        queue.put("hello1");
        queue.put("hello2");
        queue.put("hello3");
        queue.put("hello4");
        queue.put("hello5");
        // 2. take 出队列
        String result = queue.take();
        System.out.println(result);

        result = queue.take();
        System.out.println(result);

        result = queue.take();
        System.out.println(result);

        result = queue.take();
        System.out.println(result);

        result = queue.take();
        System.out.println(result);
        // 队列中 5 个值
        // 正常出了 5 个
        // 出第 6 个时，阻塞了
        result = queue.take();
        System.out.println(result);


        // 阻塞队列相当于一个缓冲区，平衡了生产者和消费者的处理能力
        // 也能使生产者和消费者之间 解耦


        // 耦合 两个模块之间的关联关系
        // 关系越强，耦合越高
        // 代码要最求低耦合，避免牵一发动全身
    }
}
